Pynecone 체험기

Build anything,Faster! Pynecone

ex_screenshot

  • pynecone은 순수 파이썬만을 이용한 웹 풀스택 프레임워크 입니다.
  • NEXT.JS 와 fastAPI를 기본 베이스로 사용하고 있습니다.
  • 파이썬(3.7+)과 노드(12.22.0+)가 필요합니다.

1. 시작하기

// venv에 pynecone을 설치합니다.
$ pip install pynecone-io

// root에 프로젝트 폴더를 생성하고, 그 안에서 pc init을 입력합니다.
$ mkdir my_app_name
$ cd my_app_name
$ pc init
  • 해당 명령어를 통해 pynecone를 시작할 수 있습니다.
  • 이후 pc run 커맨드를 통해 프로젝트를 실행합니다.
  • 특이하게 3000번 포트는 NEXT.JS, 8000번 포트는 fastAPI가 동시에 실행됩니다.
    (fastAPI가 실행된다는 점이 중요합니다.)

survey // 생성한 프로젝트 폴더
├── assets // 기본 assets 폴더
│   └── favicon.ico
├── pcconfig.py // 기본 pyneconf config 파일
├── pynecone.db // 기본적으로 제공하는 sqliteDB
├── .web // 기본적으로 생성되는 NEXT.JS 프로젝트 폴더
└── survey // 생성한 프로젝트 폴더명과 같은 App 폴더
    ├── __init__.py
    ├── base_state.py // 추가한 state class 관리 파일
    ├── end.py // 추가 페이지
    ├── home.py // 추가 페이지
    ├── landing.py // 추가 페이지
    └── survey.py // 기본 App 파일
  • 기본으로 생성되는 폴더구조입니다.
  • {프로젝트명}/{프로젝트명}/{프로젝트명.py} 의 신기한 구조를 가지고 있습니다.
  • 프로젝트폴더에선 App 폴더 변경이 가능합니다. {프로젝트명}/{변경한이름}/{변경한이름.py}


ex_screenshot

  • 파이썬과 노드 패키지가 모두 생성됩니다.
  • 파이썬패키지 중에서는 base backend인 fastAPI와 sqlalchemy가 기본적으로 설치되어 있는것을 확인할 수 있습니다.
    (openai도 있는데, 기본 튜토리얼때문에 있는것인지 모르겠습니다)
  • 노드패키지 중에서는 Pynecone 주요 컴포넌트 프레임워크인 chakra-ui 를 볼수 있으며, 그 외에도 emotion css와 d3같은 차트 라이브러리를 확인할 수 있습니다.

import pynecone as pc


config = pc.Config(
    app_name="hello",
    bun_path="$HOME/.bun/bin/bun",
    db_url="sqlite:///pynecone.db",
    env=pc.Env.DEV,
)
  • config 설정은 위와 같으며, 요즘 JS에서 빠르다는 build 툴 bun.js 사용을 할 수 있습니다.
  • db는 기본적으로 sqlit가 연결되어 있으며, sql계열은 모두 가능하다고 합니다.

2. 실제 사용

예시용 깃허브 : https://github.com/pynecone-io/pynecone-examples/tree/main/twitter


a. App 파일 준비

import pynecone as pc
# bsae State 파일
from .base_state import State
# 추가 페이지들
from .landing import Landing
from .home import Home
from .end import End


# Add state and page to the app.
app = pc.App(state=State)

# Add Pages
app.add_page(Landing, path="/", title="파인콘")
app.add_page(Home, path="/home", title="설문조사")
app.add_page(End, path="/end", title="결과")
app.compile(),
  • 기본적으로 실행시 config 파일에 입력된 App을 실행합니다.
  • 따라서 가장 기본적인 state등록과 컴파일은 App파일에서 이루어져야 합니다.
  • 기본적으로 State Class는 한개만 등록할 수 있습니다.
  • 단 root State를 상속받아 새로운 State를 사용할 수 있습니다.
  • pynecone에서는 대부분 모든것들이 pc를 이용해 호출합니다.

b. state 및 db 준비

import pynecone as pc


# DB Model Class
class SurveyUser(pc.Model, table=True):
    username: str
    q_1: str
    q_2: int
    q_3: str


# Bse State Class
class State(pc.State):
    name = "얼리페이"
    q_1: str = ""
    q_2: int = 0
    q_3: str = ""
    answers: list[SurveyUser]

# ------------------------------- Model.py ------------------------------

"""Database built into Pynecone."""

import sqlmodel

from pynecone import utils
from pynecone.base import Base


def get_engine():
    """Get the database engine.

    Returns:
        The database engine.
    """
    url = utils.get_config().db_url
    return sqlmodel.create_engine(url, echo=False)


class Model(Base, sqlmodel.SQLModel):
    """Base class to define a table in the database."""

    ...

    @staticmethod
    def create_all():
        """Create all the tables."""
        engine = get_engine()
        sqlmodel.SQLModel.metadata.create_all(engine)
  • pc.Model을 넘겨준 모델 클래스는 앱 실행시 자동으로 db를 조회하여 해당 테이블을 생성합니다. 만약 테이블이 존재한다면 생성하지 않습니다.
  • 기본적으로 sqlalchemy를 사용합니다.
  • State의 경우 기본적으로 한개만 App과 연결할 수 있습니다. 단, 상속하여 다른 State를 사용할 수는 있습니다.
  • 사실상 State내에 사용되는 함수 == API 라는 느낌입니다.
    (따로 fastAPI를 구동하지 않기 때문..)

c. 페이지 준비

import pynecone as pc
from .base_state import State


def Landing():
    return pc.center(
        pc.vstack(
            pc.text(
                "TODAY SURVEY!",
                font_size='40px',
                font_weight="bold"
            ),
            pc.input(
                on_change=State.change_name,
                placeholder="Enter your name",
                margin="20px 0 20px 0!important",
            ),
            pc.link(
                "Start",
                display="block",
                href="/home",
                width="100%",
                bg="#8262FE",
                color="#fff",
                padding="10px",
                text_align="center",
                font_weight="bold",
                border_radius="5px",
                _hover={
                    "opacity": 0.85,
                },
            ),
            width="600px",
            bg="white",
            padding="40px",
            shadow="lg",
            border_radius="lg",
        ),
        width="100%",
        height="100vh",
        bg="linear-gradient(222.47deg, #8262FE 13.82%, #8238BC 50.46%, #561674 87.1%)"
    )
  • 기본적으로 랩핑된 chakra-ui를 사용하며 emotion으로 추가 스타일링을 할 수도 있습니다.
  • 컴포넌트는 공식문서에 정리가 되어 있습니다.
  • 만든 페에지는 App파일에서 불러 등록해줍니다.
  • 기본적으로 라우팅에는 link 컴포넌트를 사용합니다.
  • State를 받아 렌더링하거나, State를 조작하는 이벤트를 등록할 수 있습니다.
  • State와 props값을 받아 JS code를 만들어 .web에 Page를 실시간 포맷팅하여 등록합니다.

ex_screenshot ex_screenshot ex_screenshot


3. 내가 생각한 장점

  • 모든것을 편하고 쉽게 만들수 있다는 말처럼 간단한 코드만으로 완전한 앱을 만들수 있습니다. 같은 풀스택 프레임워크인 장고나 플라스크와 비교해봐도 훨씬 쉬운 수준입니다.
  • 모든 State는 단발성이 아닌 backend에 기록되어 있기때문에 data가 휘발되지 않습니다.
  • db커넥션도 쉽고(sqlite) 테이블 생성도 자동으로 해주는 기능이 있습니다.
  • 이미 랩핑된 좋은 UI들이 많고, 해당 UI를 통해 컴포넌트를 만들어 사용할 수 있습니다.
  • 기존 UI 말고도 다른 UI프레임워크를 설치해 랩핑하여 사용할 수 있습니다.
  • API 방식이 아닌 직접 백엔드 코드를 앞단에서 호출하여 사용하는 느낌이라 추가적인 개발이 필요 없습니다.
  • fastAPI를 사용하기 때문에 fastAPI에 장점을 모두 가지고 있습니다.
    (docs가 의미있을지는 모르겠습니다)


4. 내가 생각한 단점

a. 리액트를 사용함으로서 생기는 문제

  • NEXT.JS도 근본이 리액트기 때문에, 리액트내에서 중요한 라이프사이클을 현재로서는 완전히 제어할 수 없습니다. 이로 인해 디버깅이 어려워 질 수 있습니다.
  • 직접 dom의 정보를 받아와야 할 경우 현재로서는 컨트롤이 상당히 힘든부분이 있습니다.
  • react 의 useState는 기본적으로 비동기적 처리를 진행합니다. 이로 인해 새로운 문제가 발생할 수 있습니다.

b. 상당히 많은 이슈

ex_screenshot

  • pynecone는 아직 나온지 얼마 되지않은 프레임워크이며, 2명의 개발자가 개발하고 있는 프로젝트입니다. 그렇다보니 아직 많은 이슈와 진행되지 않은 개발이 많습니다.
  • 불안정하며, 연결이 가끔 끊기는 등에 이슈가 있습니다.

c. 컴파일 이후 자동 등록.. 삭제는?

ex_screenshot

  • State와 prop값을 받아 포맷팅 이후 .web > pages에 자동으로 생성이 됩니다. 하지만 생성만 될뿐 해당 페이지를 없앤다고 해서 pages내에 있는 js파일이 삭제되는것은 아닙니다.
  • 해당 파일을 잘 관리하지 않으면, 잘못된 페이지로 라우팅이 될수도 있고 불필요한 파일이 build될 수도 있습니다.

d. 반쪽짜리 라우팅

ex_screenshot

  • 현재 pynecone에서 다이나믹 라우팅을 지원하고 있지 않습니다.
  • 추후 개발이 진행됨에 따라 업데이트가 되기를 기다려야 합니다.

e. 배포이슈

ex_screenshot

  • 특이한 구조로 인해 배포를 어떻게 해야하는지 모르던 중, 배포에 대해 공식문서를 찾아본 결과 현재 개발진행중입니다.
  • 역시 추후 개발이 진행됨에 따라 업데이트가 되기를 기다려야 합니다.

5. 후기

적어놓고 보니 단점에 적어둔 것들이 react를 사용하는 단점외에는 모두 개발이 진행됨에 따라 해결이 되는 단점들뿐입니다. 그에 반해 장점은 정말 쉬운 난이도로 풀스택 웹을 빠르게 만들수 있다는 장점이 있어 앞으로가 기대되는 프레임 워크인것 같습니다.


Written by@JeongYeonJae
이것저것 쓰는 개발블로그

ResumeGitHub